package helper.base.string

import helper.base.A2LHM

// 定义一个包含字符串处理辅助函数和接口的对象
//L1 旨在提供一个紧凑、单行的表示方式，适用于简单概览或当空间有限时使用。
//L2 提供了一个更详细、多行的表示方式，适用于需要深入了解对象详细内容时使用，特别是在调试或日志记录中，当需要清晰展示每个元素时。
object ToLStringHelper {
    // 定义一个接口，提供一级（L1）字符串表示的方法
    interface IToL1String {
        // 默认实现返回对象的字符串表示
        fun toL1String(): String {
            return "$this"
        }
    }

    // 定义另一个接口，提供二级（L2）字符串表示的方法
    interface IToL2String {
        // 默认实现返回对象的字符串表示
        fun toL2String(): String {
            return "$this"
        }
    }

    // 扩展 ArrayList<String> 类，添加一个方法生成一级字符串表示
    fun ArrayList<String>.toL1String(): String {
        val sb = StringBuilder()
        // 构建字符串，包含数组大小和所有元素
        sb.append("ArrayList<String>(size=${size})=[")
        this.forEach {
            sb.append("${it},")
        }
        sb.append("]")
        return sb.toString()
    }

    // 扩展 A2LHM 类（键和值都是字符串），添加一个方法生成一级字符串表示
    fun A2LHM<String, String>.toL1String(): String {
        val sb = StringBuilder()
        // 构建字符串，包含映射的大小和所有键值对
        sb.append("A2LHM(size=${size})=[")
        this.forEach { (t, u) ->
            sb.append("${t}=${u},")
        }
        sb.append("]")
        return sb.toString()
    }

    // 扩展 A2LHM 类（键和值都是字符串），添加一个方法生成二级字符串表示
    fun A2LHM<String, String>.toL2String(): String {
        val sb = StringBuilder()
        // 构建字符串，格式化为多行，每个键值对占一行，前面有制表符
        sb.append("A2LHM(size=${size})=[\n")
        this.forEach { (t, u) ->
            sb.append("\t${t}=${u}\n")
        }
        sb.append("]")
        return sb.toString()
    }

    // 扩展 String 类，添加一个方法对字符串进行制表符缩进和去除首尾空格
    fun String.preTabAndTrim(
        tabNum: Int = 1,
    ): String {
        require(tabNum >= 1) // 确保制表符数量至少为1
        // 对字符串添加指定数量的制表符缩进，并去除首尾空格
        return this.prependIndent("\t".repeat(tabNum)).trim()
    }
}
